{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # 基础线性代数扩展包\nimport pandas as pd # 数据处理工具箱\ndf_bank = pd.read_csv(\"../input/bank-customer/BankCustomer.csv\") # 读取文件\ndf_bank.head() # 显示文件前5行","execution_count":1,"outputs":[{"output_type":"execute_result","execution_count":1,"data":{"text/plain":"              Name  Gender  Age     City  Tenure  ProductsNo  HasCard  \\\n0         Kan Jian    Male   37  Tianjin       3           2        1   \n1      Xue Baochai  Female   39  Beijing       9           1        1   \n2           Mao Xi  Female   32  Beijing       9           1        1   \n3  Zheng Nengliang  Female   37  Tianjin       0           2        1   \n4          Zhi Fen    Male   55  Tianjin       4           3        1   \n\n   ActiveMember  Credit  AccountBal  Salary  Exited  \n0             1     634    31937.37  137062       0  \n1             1     556    18144.95  110194       0  \n2             1     803    10378.09  236311       1  \n3             1     778    25564.01  129910       1  \n4             0     547     3235.61  136976       1  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Name</th>\n      <th>Gender</th>\n      <th>Age</th>\n      <th>City</th>\n      <th>Tenure</th>\n      <th>ProductsNo</th>\n      <th>HasCard</th>\n      <th>ActiveMember</th>\n      <th>Credit</th>\n      <th>AccountBal</th>\n      <th>Salary</th>\n      <th>Exited</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>Kan Jian</td>\n      <td>Male</td>\n      <td>37</td>\n      <td>Tianjin</td>\n      <td>3</td>\n      <td>2</td>\n      <td>1</td>\n      <td>1</td>\n      <td>634</td>\n      <td>31937.37</td>\n      <td>137062</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>Xue Baochai</td>\n      <td>Female</td>\n      <td>39</td>\n      <td>Beijing</td>\n      <td>9</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>556</td>\n      <td>18144.95</td>\n      <td>110194</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>Mao Xi</td>\n      <td>Female</td>\n      <td>32</td>\n      <td>Beijing</td>\n      <td>9</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>803</td>\n      <td>10378.09</td>\n      <td>236311</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>Zheng Nengliang</td>\n      <td>Female</td>\n      <td>37</td>\n      <td>Tianjin</td>\n      <td>0</td>\n      <td>2</td>\n      <td>1</td>\n      <td>1</td>\n      <td>778</td>\n      <td>25564.01</td>\n      <td>129910</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>Zhi Fen</td>\n      <td>Male</td>\n      <td>55</td>\n      <td>Tianjin</td>\n      <td>4</td>\n      <td>3</td>\n      <td>1</td>\n      <td>0</td>\n      <td>547</td>\n      <td>3235.61</td>\n      <td>136976</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt #导入matplotlib画图工具箱\nimport seaborn as sns #导入seaborn画图工具箱\n# 显示不同特征的分布情况\nfeatures=[ 'City', 'Gender','Age','Tenure', \n           'ProductsNo', 'HasCard', 'ActiveMember', 'Exited']\nfig=plt.subplots(figsize=(15,15))\nfor i, j in enumerate(features):\n    plt.subplot(4, 2, i+1)\n    plt.subplots_adjust(hspace = 1.0)\n    sns.countplot(x=j,data = df_bank)\n    plt.title(\"No. of costumers\")","execution_count":2,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1080x1080 with 8 Axes>","image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# 把二元类别文本数字化\ndf_bank['Gender'].replace(\"Female\",0,inplace = True)\ndf_bank['Gender'].replace(\"Male\",1,inplace=True)\n# 显示数字类别\nprint(\"Gender unique values\",df_bank['Gender'].unique())\n# 把多元类别转换成多个二元哑变量，然后贴回原始数据集\nd_city = pd.get_dummies(df_bank['City'], prefix = \"City\")\ndf_bank = [df_bank, d_city]\ndf_bank = pd.concat(df_bank, axis = 1)\n# 构建特征和标签集合\ny = df_bank['Exited']\nX = df_bank.drop(['Name', 'Exited', 'City'], axis=1)\nX.head() #显示新的特征集","execution_count":3,"outputs":[{"output_type":"stream","text":"Gender unique values [1 0]\n","name":"stdout"},{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"   Gender  Age  Tenure  ProductsNo  HasCard  ActiveMember  Credit  AccountBal  \\\n0       1   37       3           2        1             1     634    31937.37   \n1       0   39       9           1        1             1     556    18144.95   \n2       0   32       9           1        1             1     803    10378.09   \n3       0   37       0           2        1             1     778    25564.01   \n4       1   55       4           3        1             0     547     3235.61   \n\n   Salary  City_Beijing  City_Shanghai  City_Tianjin  \n0  137062             0              0             1  \n1  110194             1              0             0  \n2  236311             1              0             0  \n3  129910             0              0             1  \n4  136976             0              0             1  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Gender</th>\n      <th>Age</th>\n      <th>Tenure</th>\n      <th>ProductsNo</th>\n      <th>HasCard</th>\n      <th>ActiveMember</th>\n      <th>Credit</th>\n      <th>AccountBal</th>\n      <th>Salary</th>\n      <th>City_Beijing</th>\n      <th>City_Shanghai</th>\n      <th>City_Tianjin</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>37</td>\n      <td>3</td>\n      <td>2</td>\n      <td>1</td>\n      <td>1</td>\n      <td>634</td>\n      <td>31937.37</td>\n      <td>137062</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>0</td>\n      <td>39</td>\n      <td>9</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>556</td>\n      <td>18144.95</td>\n      <td>110194</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0</td>\n      <td>32</td>\n      <td>9</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>803</td>\n      <td>10378.09</td>\n      <td>236311</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>0</td>\n      <td>37</td>\n      <td>0</td>\n      <td>2</td>\n      <td>1</td>\n      <td>1</td>\n      <td>778</td>\n      <td>25564.01</td>\n      <td>129910</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1</td>\n      <td>55</td>\n      <td>4</td>\n      <td>3</td>\n      <td>1</td>\n      <td>0</td>\n      <td>547</td>\n      <td>3235.61</td>\n      <td>136976</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split # 拆分数据集\nX_train, X_test, y_train, y_test = train_test_split(X, y, \n                                   test_size=0.2, random_state=0)","execution_count":4,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 对多棵决策树进行Bagging，即树的聚合\nfrom sklearn.ensemble import BaggingClassifier # 导入Bagging分类器\nfrom sklearn.tree import DecisionTreeClassifier # 导入决策树分类器\nfrom sklearn.metrics import (f1_score, confusion_matrix) # 导入评估标准\ndt = BaggingClassifier(DecisionTreeClassifier()) # 只使用一棵决策树\ndt.fit(X_train, y_train) # 拟合模型\ny_pred = dt.predict(X_test) # 进行预测\nprint(\"决策树测试准确率: {:.2f}%\".format(dt.score(X_test, y_test)*100))\nprint(\"决策树测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))\nbdt = BaggingClassifier(DecisionTreeClassifier()) #树的Bagging\nbdt.fit(X_train, y_train) # 拟合模型\ny_pred = bdt.predict(X_test) # 进行预测\nprint(\"决策树Bagging测试准确率: {:.2f}%\".format(bdt.score(X_test, y_test)*100))\nprint(\"决策树Bagging测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":6,"outputs":[{"output_type":"stream","text":"决策树测试准确率: 84.70%\n决策树测试F1分数: 56.66%\n决策树Bagging测试准确率: 85.45%\n决策树Bagging测试F1分数: 57.76%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import GridSearchCV # 导入网格搜索工具\n# 使用网格搜索优化参数\nbdt_param_grid = {\n    'base_estimator__max_depth' : [5,10,20,50,100],\n    'n_estimators' : [1, 5, 10, 50]}\nbdt_gs = GridSearchCV(BaggingClassifier(DecisionTreeClassifier()),\n                   param_grid = bdt_param_grid, scoring = 'f1',\n                   n_jobs= 10, verbose = 1)\nbdt_gs.fit(X_train, y_train) # 拟合模型\nbdt_gs = bdt_gs.best_estimator_ # 最佳模型\ny_pred = bdt.predict(X_test) # 进行预测\nprint(\"决策树Bagging测试准确率: {:.2f}%\".format(bdt_gs.score(X_test, y_test)*100)) \nprint(\"决策树Bagging测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":8,"outputs":[{"output_type":"stream","text":"Fitting 5 folds for each of 20 candidates, totalling 100 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.\n[Parallel(n_jobs=10)]: Done  30 tasks      | elapsed:    9.8s\n[Parallel(n_jobs=10)]: Done 100 out of 100 | elapsed:   29.6s finished\n","name":"stderr"},{"output_type":"stream","text":"决策树Bagging测试准确率: 86.25%\n决策树Bagging测试F1分数: 57.76%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier # 导入随机森林分类器\nrf = RandomForestClassifier() # 随机森林模型\n# 使用网格搜索优化参数\nrf_param_grid = {\"max_depth\": [None],\n              \"max_features\": [1, 3, 10],\n               \"min_samples_split\": [2, 3, 10],\n               \"min_samples_leaf\": [1, 3, 10],\n              \"bootstrap\": [True,False],\n              \"n_estimators\" :[100,300],\n              \"criterion\": [\"gini\"]}\nrf_gs = GridSearchCV(rf,param_grid = rf_param_grid, \n                     scoring=\"f1\", n_jobs= 10, verbose = 1)\nrf_gs.fit(X_train,y_train) # 拟合模型\nrf_gs = rf_gs.best_estimator_ # 最佳模型\ny_pred = rf_gs.predict(X_test) # 进行预测\nprint(\"随机森林测试准确率: {:.2f}%\".format(rf_gs.score(X_test, y_test)*100))\nprint(\"随机森林测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100)) ","execution_count":10,"outputs":[{"output_type":"stream","text":"Fitting 5 folds for each of 108 candidates, totalling 540 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.\n[Parallel(n_jobs=10)]: Done  30 tasks      | elapsed:   26.9s\n[Parallel(n_jobs=10)]: Done 180 tasks      | elapsed:  3.2min\n[Parallel(n_jobs=10)]: Done 430 tasks      | elapsed: 10.5min\n[Parallel(n_jobs=10)]: Done 540 out of 540 | elapsed: 17.0min finished\n","name":"stderr"},{"output_type":"stream","text":"随机森林测试准确率: 86.50%\n随机森林测试F1分数: 60.18%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import ExtraTreesClassifier # 导入极端随机森林模型\next = ExtraTreesClassifier() # 极端随机森林模型\n# 使用网格搜索优化参数\next_param_grid = {\"max_depth\": [None],\n              \"max_features\": [1, 3, 10],\n              \"min_samples_split\": [2, 3, 10],\n              \"min_samples_leaf\": [1, 3, 10],\n              \"bootstrap\": [True,False],\n              \"n_estimators\" :[100,300],\n              \"criterion\": [\"gini\"]}\next_gs = GridSearchCV(ext,param_grid = ext_param_grid, scoring=\"f1\", \n                     n_jobs= 4, verbose = 1)\next_gs.fit(X_train,y_train) # 拟合模型\next_gs = ext_gs.best_estimator_ # 最佳模型\ny_pred = ext_gs.predict(X_test) # 进行预测\nprint(\"更多树测试准确率: {:.2f}%\".format(ext_gs.score(X_test, y_test)*100))\nprint(\"更多树测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":12,"outputs":[{"output_type":"stream","text":"Fitting 5 folds for each of 108 candidates, totalling 540 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n[Parallel(n_jobs=4)]: Done  42 tasks      | elapsed:   28.8s\n[Parallel(n_jobs=4)]: Done 192 tasks      | elapsed:  2.1min\n[Parallel(n_jobs=4)]: Done 442 tasks      | elapsed:  5.4min\n[Parallel(n_jobs=4)]: Done 540 out of 540 | elapsed:  7.5min finished\n","name":"stderr"},{"output_type":"stream","text":"更多树测试准确率: 86.50%\n更多树测试F1分数: 59.34%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import AdaBoostClassifier # 导入AdaBoost模型\ndt = DecisionTreeClassifier() # 选择决策树分类器作为AdaBoost的基准算法\nada = AdaBoostClassifier(dt) # AdaBoost模型\n# 使用网格搜索优化参数\nada_param_grid = {\"base_estimator__criterion\" : [\"gini\", \"entropy\"],\n                  \"base_estimator__splitter\" :   [\"best\", \"random\"],\n                  \"base_estimator__random_state\" :   [7,9,10,12,15],\n                  \"algorithm\" : [\"SAMME\",\"SAMME.R\"],\n                  \"n_estimators\" :[1,2,5,10],\n                  \"learning_rate\":  [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3,1.5]}\nada_gs = GridSearchCV(ada,param_grid = ada_param_grid, \n                        scoring=\"f1\", n_jobs= 10, verbose = 1)\nada_gs.fit(X_train,y_train) # 拟合模型\nada_gs = ada_gs.best_estimator_ # 最佳模型\ny_pred = ada_gs.predict(X_test) # 进行预测\nprint(\"Adaboost测试准确率: {:.2f}%\".format(ada_gs.score(X_test, y_test)*100))\nprint(\"Adaboost测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":14,"outputs":[{"output_type":"stream","text":"Fitting 5 folds for each of 1120 candidates, totalling 5600 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.\n[Parallel(n_jobs=10)]: Done  30 tasks      | elapsed:    2.6s\n[Parallel(n_jobs=10)]: Done 180 tasks      | elapsed:    9.4s\n[Parallel(n_jobs=10)]: Done 430 tasks      | elapsed:   16.5s\n[Parallel(n_jobs=10)]: Done 780 tasks      | elapsed:   25.1s\n[Parallel(n_jobs=10)]: Done 1230 tasks      | elapsed:   39.0s\n[Parallel(n_jobs=10)]: Done 1780 tasks      | elapsed:   59.0s\n[Parallel(n_jobs=10)]: Done 2430 tasks      | elapsed:  1.4min\n[Parallel(n_jobs=10)]: Done 3180 tasks      | elapsed:  1.8min\n[Parallel(n_jobs=10)]: Done 4030 tasks      | elapsed:  2.2min\n[Parallel(n_jobs=10)]: Done 4980 tasks      | elapsed:  2.8min\n","name":"stderr"},{"output_type":"stream","text":"Adaboost测试准确率: 78.85%\nAdaboost测试F1分数: 47.71%\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Done 5600 out of 5600 | elapsed:  3.2min finished\n","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import GradientBoostingClassifier # 导入梯度提升分类器\ngb = GradientBoostingClassifier() # 梯度提升分类器\n# 使用网格搜索优化参数\ngb_param_grid = {'loss' : [\"deviance\"],\n                 'n_estimators' : [100,200,300],\n                 'learning_rate': [0.1, 0.05, 0.01],\n                 'max_depth': [4, 8],\n                 'min_samples_leaf': [100,150],\n                 'max_features': [0.3, 0.1]}\ngb_gs = GridSearchCV(gb,param_grid = gb_param_grid,\n                     scoring=\"f1\", n_jobs= 10, verbose = 1)\ngb_gs.fit(X_train,y_train) # 拟合模型\ngb_gs = gb_gs.best_estimator_ # 最佳模型\ny_pred = gb_gs.predict(X_test) # 进行预测\nprint(\"梯度提升测试准确率: {:.2f}%\".format(gb_gs.score(X_test, y_test)*100))\nprint(\"梯度提升测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":16,"outputs":[{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.\n","name":"stderr"},{"output_type":"stream","text":"Fitting 5 folds for each of 72 candidates, totalling 360 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Done  30 tasks      | elapsed:   20.5s\n[Parallel(n_jobs=10)]: Done 180 tasks      | elapsed:  2.1min\n[Parallel(n_jobs=10)]: Done 360 out of 360 | elapsed:  4.3min finished\n","name":"stderr"},{"output_type":"stream","text":"梯度提升测试准确率: 86.50%\n梯度提升测试F1分数: 60.64%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from xgboost import XGBClassifier # 导入XGB分类器\nxgb = XGBClassifier() # XGB分类器\n# 使用网格搜索优化参数\nxgb_param_grid = {'min_child_weight': [1, 5, 10],\n                  'gamma': [0.5, 1, 1.5, 2, 5],\n                  'subsample': [0.6, 0.8, 1.0],\n                  'colsample_bytree': [0.6, 0.8, 1.0],\n                  'max_depth': [3, 4, 5]}\nxgb_gs = GridSearchCV(xgb,param_grid = xgb_param_grid,  \n                     scoring=\"f1\", n_jobs= 10, verbose = 1)\nxgb_gs.fit(X_train,y_train) # 拟合模型\nxgb_gs = xgb_gs.best_estimator_ # 最佳模型\ny_pred = xgb_gs.predict(X_test) # 进行预测\nprint(\"XGB测试准确率: {:.2f}%\".format(xgb_gs.score(X_test, y_test)*100))\nprint(\"XGB测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":18,"outputs":[{"output_type":"stream","text":"Fitting 5 folds for each of 405 candidates, totalling 2025 fits\n","name":"stdout"},{"output_type":"stream","text":"[Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.\n[Parallel(n_jobs=10)]: Done  30 tasks      | elapsed:   14.5s\n[Parallel(n_jobs=10)]: Done 180 tasks      | elapsed:  1.0min\n[Parallel(n_jobs=10)]: Done 430 tasks      | elapsed:  2.4min\n[Parallel(n_jobs=10)]: Done 780 tasks      | elapsed:  4.3min\n[Parallel(n_jobs=10)]: Done 1230 tasks      | elapsed:  6.9min\n[Parallel(n_jobs=10)]: Done 1780 tasks      | elapsed: 10.6min\n[Parallel(n_jobs=10)]: Done 2025 out of 2025 | elapsed: 12.3min finished\n","name":"stderr"},{"output_type":"stream","text":"XGB测试准确率: 86.30%\nXGB测试F1分数: 60.17%\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import  VotingClassifier # 导入Voting分类器\n# 把各种模型的分类结果进行Voting，同学们还可以加入更多模型如SVM，kNN等\nvoting = VotingClassifier(estimators=[('rf', rf_gs),\n                                      ('gb',gb_gs),\n                                      ('ext', ext_gs),\n                                      ('xgb', xgb_gs),\n                                      ('ada', ada_gs)],\n\n                          voting='soft', n_jobs=10)\nvoting = voting.fit(X_train, y_train) # 拟合模型\ny_pred = voting.predict(X_test) # 进行预测\nprint(\"Voting测试准确率: {:.2f}%\".format(voting.score(X_test, y_test)*100)) \nprint(\"Voting测试F1分数: {:.2f}%\".format(f1_score(y_test, y_pred)*100))","execution_count":20,"outputs":[{"output_type":"stream","text":"Voting测试准确率: 86.35%\nVoting测试F1分数: 60.49%\n","name":"stdout"}]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":4}